13. 练习:维度

维度

和神经网络一样,我们按以下步骤在 Keras 中创建 CNN:首先创建一个 序列 模型。

使用 .add() 方法向该网络中添加层级。

将以下代码复制粘贴到叫做 conv-dims.py 的 Python 可执行文件中:

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, strides=2, padding='valid', 
    activation='relu', input_shape=(200, 200, 1)))
model.summary()

我们不会训练该 CNN;相反,我们将使用该可执行文件根据所提供的参数研究卷积层的维度如何变化。

运行 python path/to/conv-dims.py 并查看输出。应该如下所示:

卷积层的维度符合你的期望吗?

你可以随意更改在 conv-dims.py 文件中为参数( filters kernel_size 等)分配的值。

注意卷积层中的 参数数量 是如何变化的。对应的是输出内容中的 Param # 下的值。在上图中,卷积层具有 80 个参数。

同时注意卷积层的 形状 是如何变化的。对应的是输出内容中的 Output Shape 下的值。在上图中, None 对应的是批次大小,卷积层的高度为 100 ,宽度为 100 ,深度为 16

公式:卷积层中的参数数量

卷积层中的参数数量取决于 filters kernel_size input_shape 的值。我们定义几个变量:

  • K - 卷积层中的过滤器数量
  • F - 卷积过滤器的高度和宽度
  • D_in - 上一层级的深度

注意: K = filters F = kernel_size 。类似地, D_in input_shape 元组中的最后一个值。

因为每个过滤器有 F*F*D_in 个权重,卷积层由 K 个过滤器组成,因此卷积层中的权重总数是 K*F*F*D_in 。因为每个过滤器有 1 个偏差项,卷积层有 K 个偏差。因此,卷积层中的 参数数量 K*F*F*D_in + K

公式:卷积层的形状

卷积层的形状取决于 kernel_size input_shape padding stride 的值。我们定义几个变量:

  • K - 卷积层中的过滤器数量
  • F - 卷积过滤器的高度和宽度
  • H_in - 上一层级的高度
  • W_in - 上一层级的宽度

注意: K = filters F = kernel_size ,以及 S = stride 。类似地, H_in W_in 分别是 input_shape 元组的第一个和第二个值。

卷积层的 深度 始终为过滤器数量 K

如果 padding = 'same' ,那么卷积层的空间维度如下:

  • height = ceil(float( H_in ) / float( S ))
  • width = ceil(float( W_in ) / float( S ))

如果 padding = 'valid' ,那么卷积层的空间维度如下:

  • height = ceil(float( H_in - F + 1) / float( S ))
  • width = ceil(float( W_in - F + 1) / float( S ))

练习

请更改 conv-dims.py 文件,使其如下所示:

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=3, strides=2, padding='same', 
    activation='relu', input_shape=(128, 128, 3)))
model.summary()

运行 python path/to/conv-dims.py ,并使用输出回答以下问题。

卷积层有多少个参数?

SOLUTION: 896

卷积层的深度是多少?

SOLUTION: 32

卷积层的宽度是多少?

SOLUTION: 64